// 判断arr是否为一个数组，返回一个bool值
function isArray(arr) {
    // your implement
    // return Array.isArray(arr)
    return arr instanceof Array
}

// 判断fn是否为一个函数，返回一个bool值
function isFunction(fn) {
    // your implement
    return typeof fn == 'function'
}



// 使用递归来实现一个深度克隆，可以复制一个目标对象，返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
function cloneObject(src) {
    var temp;
    //0. 判断数据类型
    if (isArray(src)) {
        //1. 数组克隆
        temp = []
        //TODO: 复制1个到多个
        for (const item of src) {
            temp.push(item)
        }
    } else if (typeof src == 'object') {
        //2. 对象克隆
        temp = {}
        for (const key in src) {
            temp[key] = cloneObject(src[key])
        }
    } else {
        temp = src
    }
    return temp
}

//2. 对象克隆
var teacher = {name: '忘忧大师', age: 60, kongfu: ['天眼通', '天魔舞', '金刚伏魔神通']}
var tea_ai = cloneObject(teacher)
teacher['age'] = 999
teacher['kongfu'][0] = ''
console.log(tea_ai);


//1. 数组克隆
var kongfu = ['天眼通', '天魔舞', '金刚伏魔神通']
var wuxin = cloneObject(kongfu);
kongfu[0] = ''
console.log(wuxin);

// 测试用例：
var srcObj = {
    a: 1,
    b: {
        b1: ["hello", "hi"],
        b2: "JavaScript"
    }
};
var abObj = srcObj;
var tarObj = cloneObject(srcObj);

srcObj.a = 2;
srcObj.b.b1[0] = "Hello";

// console.log(abObj.a);
// console.log(abObj.b.b1[0]);

// console.log(tarObj.a);      // 1
// console.log(tarObj.b.b1[0]);    // "hello"


// 实现一个简单的trim函数，用于去除一个字符串，头部和尾部的空白字符
// 假定空白字符只有半角空格、Tab
// 练习通过循环，以及字符串的一些基本方法，分别扫描字符串str头部和尾部是否有连续的空白字符，并且删掉他们，最后返回一个完成去除的字符串
function simpleTrim(str) {
    //1. 从前往后找不为空白
    var front = 0
    for (let index = 0; index < str.length; index++) {
        const element = str[index];
        if (element != ' ') {
            front = index
            break
        }
    }
    //2. 从后往前
    var end = str.length-1
    for (let index = end; index < str.length; index--) {
        const element = str[index];
        if (element != ' ') {
            end = index
            break
        }
    }
    //3. substr
    return str.substring(front,end+1)
}

// 很多同学肯定对于上面的代码看不下去，接下来，我们真正实现一个trim
// 对字符串头尾进行空格字符的去除、包括全角半角空格、Tab等，返回一个字符串
// 尝试使用一行简洁的正则表达式完成该题目
function trim(str) {
    // your implement
    //TODO: 让后面的\s匹配后面的空白内容
    var re = /^\s*(.+?)\s*$/
    var res = re.exec(str)
    return res[1]
}

// 使用示例
var str = '  h$%i  !hjha  ';
str1 = trim(str);
console.log(str1); // 'hi!'



// 实现一个遍历数组的方法，针对数组中每一个元素执行fn函数，并将数组索引和元素作为参数传递
function each(arr, fn) {
    for (let index = 0; index < arr.length; index++) {
        const item = arr[index];
        fn(item, index)
    }
}

// 其中fn函数可以接受两个参数：item和index

// 使用示例
var arr = ['java', 'c', 'php', 'html'];
function output(item, index) {
    console.log(index + ': ' + item)
}
each(arr, output);  // java, c, php, html

// 使用示例
var arr = ['java', 'c', 'php', 'html'];
function output(item) {
    console.log(item)
}
each(arr, output);  // 0:java, 1:c, 2:php, 3:html
